package main

/* 
  by zy, 2025.11.05

  删除指定证书

  -delete -cert-id <ID>  删除指定证书
  -delete -cn <Common Name> -expired  删除指定 CN 的所有过期证书

  除认证错误外可能出错的原因:
   - 指定的证书 ID 不存在
   - 指定的证书与服务域名处理绑定状态

*/

import (
  "os"
  "fmt"
  "net/http"
)

type RespBodyDelete struct {
  Code         int    `json:"code"`
  Error        string `json:"error"`
  ErrorCode    string `json:"error_code"`
}

func handleDelete(cfg *CLI) {
  if cfg.CertID != "" {
    deleteByCertId(cfg) // 优先删除单个证书
  } else if cfg.CN != "" && cfg.Expired { // 如果未定义 CertID, 则尝试批量删除某一 CommonName 的所有过期证书
    deleteExpiredByCN(cfg)
  } else {
    fmt.Printf("This Message should NOT be seen\n")
    os.Exit(ExitOtherError)
  }
}

// 删除单个证书
func deleteByCertId(cfg *CLI) {
  resp, err := sendDeleteRequest(cfg)  
  if err != nil {
    fmt.Fprintf(os.Stderr, "failed to send http request: %v\n", err)
    os.Exit(ExitRequestError)
  }
  defer resp.Body.Close()
  
  r, err := parseResp[RespBodyDelete](resp)
  if err != nil {
    fmt.Fprintf(os.Stderr, "failed to parse response: %v\n", err)
    os.Exit(ExitUnmarshalError)
  }
  if resp.StatusCode == 200 {
    fmt.Printf("Delete Cert: %s OK\n", cfg.CertID)
  } else {
    fmt.Printf("Delete Cert: %s Failed, StatusCode: %d, code: %d, error: %s\n", cfg.CertID, resp.StatusCode, r.Code, r.Error);
  }
}

// 批量删除指定 CN 的过期证书, 需要调用 loopListRequest() 获取证书列表
func deleteExpiredByCN(cfg *CLI) {
  loopListRequest(cfg, func(certs []Cert) { 
    for i := range certs {
      if certs[i].CommonName == cfg.CN && certs[i].IsExpired() {
        cfg.CertID = certs[i].CertID
        deleteByCertId(cfg)
      }
    }
  }) // -> subcmd_list.go
}

func sendDeleteRequest(cfg *CLI) (*http.Response, error) {  // DELETE /sslcert/<cert-id>, Content-Type: application/json
  return sendQiNiuRequest(cfg, http.MethodDelete, "/sslcert/" + cfg.CertID, "", nil)
}

